package com.fenshengou.xsm;

import android.widget.Toast;

import com.facebook.react.bridge.NativeModule;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.bridge.ReactContext;
import com.facebook.react.bridge.ReactContextBaseJavaModule;
import com.facebook.react.bridge.ReactMethod;

import java.util.Map;
import java.util.HashMap;


// 一个原生模块是一个继承了ReactContextBaseJavaModule的 Java 类，
// 它可以实现一些 JavaScript 所需的功能。
// 我们这里的目标是可以在 JavaScript 里写ToastExample.show('Awesome', ToastExample.SHORT);，
// 来调起一个短暂的 Toast 通知。
public class ToastModule extends ReactContextBaseJavaModule {
    private static ReactApplicationContext reactContext;

    private static final String DURATION_SHORT_KEY = "SHORT";
    private static final String DURATION_LONG_KEY = "LONG";

    public ToastModule(ReactApplicationContext reactContext) {
        super(reactContext);
        // reactContext = context;
    }

    //   ReactContextBaseJavaModule要求派生类实现getName方法。
// 这个函数用于返回一个字符串名字，这个名字在 JavaScript 端标记这个模块。
// 这里我们把这个模块叫做ToastExample，这样就可以在 JavaScript 中通过NativeModules.ToastExample访问到这个模块。
// 译注：RN 已经内置了一个名为 ToastAndroid 的模块，所以在练习时请勿使用 ToastAndroid 的名字，否则运行时会报错名字冲突！
    @Override
    public String getName() {
        return "ToastExample";
    }

    //   一个可选的方法getContants返回了需要导出给 JavaScript 使用的常量。
// 它并不一定需要实现，但在定义一些可以被 JavaScript 同步访问到的预定义的值时非常有用。
    @Override
    public Map<String, Object> getConstants() {
        final Map<String, Object> constants = new HashMap<>();
        constants.put(DURATION_SHORT_KEY, Toast.LENGTH_SHORT);
        constants.put(DURATION_LONG_KEY, Toast.LENGTH_LONG);
        return constants;
    }

    //   要导出一个方法给 JavaScript 使用，Java 方法需要使用注解@ReactMethod。
// 方法的返回类型必须为void。
// React Native 的跨语言访问是异步进行的，所以想要给 JavaScript 返回一个值的唯一办法是使用回调函数或者发送事件（参见下文的描述）。
    @ReactMethod
    public void show(String message, int duration) {
        Toast.makeText(getReactApplicationContext(), message, duration).show();
    }
}
